#include "app_manager.h"
// rtos
#include "FreeRTOS.h"
// #include "event_groups.h"
// #include "semphr.h"
// #include "task.h"
// lib
#include <string.h>
#include "debug.h"
// bsp
#include "bsp_led_ctrl.h"
// app
#include "app_global.h"             // 全局变量与通用函数
#include "common_param.h"           // 设备参数相关
#include "task_system.h"            // 系统管理相关任务代码
#include "restart_info.h"
#include "task_test.h"

void App_Advanced_Init(void);
void App_Application_Create(void);

/**
 * @brief 
 * 
 */
void App_Init(void)
{
    _DEBUG_PRINT(DBG_SYS, "app start ...\r\n");

    // //创建全局事件列表
    global_event = xEventGroupCreate();
    //创建杀虫灯事件列表
    // disinsection_event = xEventGroupCreate();
    // 创建高级初始化任务
    // xTaskCreate((TaskFunction_t)App_Advanced_Init, "adv_init", 256, NULL, 2, NULL);
    // 创建应用层任务
    // xTaskCreate((TaskFunction_t)App_Application_Create, "app_create", 256, NULL, 2, NULL);
    // 创建test任务
    xTaskCreate((TaskFunction_t)App_Application_Test, "Test_Task", 128, NULL, 1, NULL);
    // xTaskCreate((TaskFunction_t)App_Application_Test_2, "Test2_Task", 128, NULL, 1, NULL);
    // 创建喂狗任务
    xTaskCreate((TaskFunction_t)Task_System_Watch_Dog_Feed, "feed_dog", 128, NULL, 2, NULL);

    _DEBUG_PRINTF(DBG_SYS, "FreeRTOS Start\r\n");
    vTaskStartScheduler(); // RTOS调度开始
    //! 不允许执行到这里
    _DEBUG_PRINT(DBG_ERR, "ERROR! SYSTEM STACK ERROR!!!\r\n");
}

/**
 * @brief 高级初始化任务
 *
 */
void App_Advanced_Init(void)
{
    _DEBUG_PRINTF(DBG_APP, "advanced init start\r\n");
    // 从掉电储存器读取参数
    // Common_Param_Update_Form_Rom();
    // //从备份寄存器读取重启信息
    // Restart_Info_Read_Bpr();
    // 连接海睿服务器
    // Task_Comm_Server_Connect(HOIRE_RNB_IPV4, HOIRE_RNB_PORT);
    // 从设备读取/生成参数
    Common_Param_Update_Form_Device();
    // 打印开机信息页
    System_Info_Print();
    // //设置初始化完成标志位
    xEventGroupSetBits(global_event, app_advanced_init_done);
    _DEBUG_PRINTF(DBG_APP, "advanced init started, delete\r\n");
    vTaskDelete(NULL); // 删除本任务
}

/**
 * @brief 创建应用层任务
 *
 */
void App_Application_Create(void)
{
    /*
    // 等待高级初始化结束
    xEventGroupWaitBits(global_event, app_advanced_init_done, pdFALSE, pdFALSE, portMAX_DELAY);
    _DEBUG_PRINTF(DBG_APP, "create application task\r\n");

    if(!(xEventGroupGetBits(global_event)&use_offline_mode))        // 如果工作于在线模式
    {
        _DEBUG_PRINTF(DBG_APP, "use online mode\r\n");
        //通信任务--------------------------------------------------------------------------------------------------
        //创建网络数据接收消息队列
        network_receiver_queue = xQueueCreate(NETWORK_RECEIVER_QUEUE_LEN, NETWORK_RECEIVER_QUEUE_SIZE);
        //创建网络数据发送消息队列
        network_transmitter_queue = xQueueCreate(NETWORK_TRANSMITTER_QUEUE_LEN, NETWORK_TRANSMITTER_QUEUE_SIZE);
        //创建网络看门狗计数信号量
        comm_watch_dog_count = xSemaphoreCreateCounting(COMM_WATCH_DOG_COUNT_MAX, COMM_WATCH_DOG_COUNT_MAX);

        //创建网络看门狗（监测周期内无有效通讯则重启设备
        xTaskCreate((TaskFunction_t)Task_Comm_Watch_Dog, "comm_watch_dog", 128, NULL, 5, NULL);
        //创建网络数据接收任务（负责把网络接收的数据片段整合成一个完整的数据包
        xTaskCreate((TaskFunction_t)Task_Comm_Receiver, "network_rx", 256, NULL, 5, NULL);
        //创建网络数据发送任务（负责将发送队列里的数据包送到网络发送
        xTaskCreate((TaskFunction_t)Task_Comm_Transmitter, "network_tx", 256, NULL, 5, NULL);
        //创建网络数据包分析（负责检查数据包格式并调用对应的解析指令
        xTaskCreate((TaskFunction_t)Task_Protocol_Analyse, "network_analyse", 512, NULL, 5, NULL);
        //心跳包上传任务（让服务器端保持在线状态
        xTaskCreate((TaskFunction_t)Task_Protocol_Heartbeat, "heart_beat", 128, NULL, 4, NULL);
        //服务器初始化（从海睿平台跳转至客户平台，并初始化服务器信息
        xTaskCreate((TaskFunction_t)Task_Protocol_Server_Init, "server_info", 128, NULL, 4, NULL);
        //定期上报设备状态（定时上报电池/充电电压，当前工作状态，电击次数等数值
        xTaskCreate((TaskFunction_t)Task_Protocol_Report_Status, "regular_report", 128, NULL, 4, NULL);
        //定时获取杀虫灯工作模式/时间区间任务
        xTaskCreate((TaskFunction_t)Task_Protocol_Get_Timing, "get_timing", 128, NULL, 4, NULL);
    }

    // 杀虫灯任务--------------------------------------------------------------------------------------------------
    // 杀虫灯初始化
    Disinsection_Init();
    //电击升压循环与杀虫计数任务
    xTaskCreate((TaskFunction_t)Task_High_Voltage, "high_voltage", 128, NULL, 4, NULL);
    //杀虫灯设备状态监控任务
    xTaskCreate((TaskFunction_t)Task_Disinsection_Monitor, "device_monitor", 128, NULL, 4, NULL);
    //杀虫灯状态机任务
    xTaskCreate((TaskFunction_t)Task_Disinsection_Fsm, "disinsection_fsm", 256, NULL, 4, NULL);

    //离线模式下，调用保存的工作时间区间，并置位工作条件
    if(xEventGroupGetBits(global_event)&use_offline_mode)
    {
        _DEBUG_PRINTF(DBG_APP, "use offline mode\r\n");
        //获取RTC时间，判断当前RTC时间是否为正确的北京时间
        uint16_t time_list[6];
        Rtc_Get_Time(time_list);
        if(time_list[year] >= 2023)//如果RTC内部已记录了北京时间
        {
            //则以上次通信保存的服务器设置来运行
            disinsection.control_mode = system_param.dis_param.control_mode;
            disinsection.run_time = system_param.dis_param.run_time;
            disinsection.end_time = system_param.dis_param.end_time;
        }
        else
        {
            //否则只能以光控模式运行
            disinsection.control_mode = 0;//光控模式
            disinsection.run_time = 8;//默认工作八小时（机器人也要讲劳动法！
            disinsection.end_time = 0;
        }
        xEventGroupSetBits(disinsection_event, disinsection_get_work_time);
        xEventGroupSetBits(disinsection_event, disinsection_get_report_frq);
    }

    _DEBUG_PRINTF(DBG_APP, "delete created-application-task\r\n");
    vTaskDelete(NULL); // 删除本任务
    */
}
